﻿#define  _CRT_SECURE_NO_WARNINGS  1
#include <stdio.h>
//浮点数在内存中的存储
//int main()
//{
//	int n = 9;
//	//00000000 00000000 00000000 00001001--9的补码
//	// &n 类型是 int * 的
//	float* pFloat = (float*)&n;
//	//对于32位的浮点数，最⾼的1位存储符号位S，接着的8位存储指数E，剩下的23位存储有效数字M
//	//0 00000000 000000000000000000001001
//	// 浮点数取的过程  E 如果E全为0 浮点数的指数E=1-127（或1023），得到真实值，有效数字M不再加上第一位的1，而是还原成0.xxxxxx的小数
//	//S=0   E=1-127=-126  M=0.000000000000000000001001
//	//(-1)^0*0.000000000000000000001001*2^(-126)
//	printf("n的值为：%d\n", n);
//	//%d 打印有符号的整数   //9
//	printf("*pFloat的值为：%f\n", *pFloat);
//	//Float 类型是（float *）//0.000000 float默认保留6位小数
//	*pFloat = 9.0;
//	// 9.0
//	//1001.0
//	//1.001*2^3
//	//S=0  M=1.001 E=3
//	//(-1)^0*1.001*2^3  E=3+127=130
//	//浮点数存的过程
//	//0 10000010 00100000000000000000000
//	printf("num的值为：%d\n", n);//1091567616
//	printf("*pFloat的值为：%f\n", *pFloat);//9.000000
//	return 0;
//}
//

//int main()
//{
//	float f = 5.5;
//	//   1  0   1 .   1（二进制的写法）
//	// 2^2 2^1 2^0    2^-1
//	//1.011*2^2(科学计数法的形式)
//	//(-1)^0*1.011*2^2
//	//S=0  M=1.011 E=2  2+127=129
//	//0  10000001  01100000000000000000000
//	//01000000 10110000 00000000 00000000
//	// 16进制的表达形式 (以小端)00 00 b0 40
//	//0x40 b0 00 00
//	return 0;
//}


//浮点数在内存中无法精确保存的原因
//int main()
//{
//	float f = 3.14;//(十进制)
//	//11.
//	//0.14 （二进制很难精确表示出来） 
//	return 0;
//}

//int main()
//{
//	if (0.1 + 0.2 == 0.3)
//		printf("==\n");
//	else
//		printf("!=\n");
//	return 0;
//}

//fabs--是求浮点数的绝对值的
//#include <math.h>
//int main()
//{
//	if (fabs(0.1 + 0.2 - 0.3) < 0.0000001)
//		printf("==\n");
//	else
//		printf("!=\n");
//	return 0;
//}

//结构体类型
//struct Stu
//{
//	char name[20];
//	int age;
//	double weight;
//	char id[20];
//}s4,s5;     //s4，s5是全局的结构体变量
//int main()
//{
//	struct Stu s1 = { "zhangsan",18,78.5,"2004010" };//s1是局部变量
//	struct Stu s2 = { .age = 18,.id = "2003010",.name = "lisi",.weight = 66.4 };
//	printf("%s %d %lf %s\n", s1.name, s1.age, s1.weight, s1.id);   //     结构体变量名.成员名
//	printf("名字:%s,学生号:%s\n", s2.name, s2.id);
// 	return 0;
//}

//结构的特殊声明
//匿名结构体--这种类型只能使用一次
//struct
//{
//	char c;
//	int i;
//	double f;
//}s;
//int main()
//{
//	s.i = 100;
//	printf("%d\n", s.i);
//	return 0;
//}

//struct
//{
//	char c;
//	int  i;
//	double f;
//}s;
//struct
//{
//	char c;
//	int i;
//	double f;
//}*p;
//int main()
//{
//	p = &s;
//	return 0;
//}

//struct
//{
//    int a;
//    char b;
//    float c;
//}x;
//
//struct
//{
//    int a;
//    char b;
//    float c;
//}* p;
//
//
//int main()
//{
//    p = &x;//ok?不ok，因为
//   //警告: 编译器会把上⾯的两个声明当成完全不同的两个类型，所以是⾮法的。
//    //    匿名的结构体类型，如果没有对结构体类型重命名的话，基本上只能使⽤⼀次
//    return 0;
//}

//结构体的自引用
//struct Node
//{
//	int data;
//	struct Node n;//n表示下一个结点的位置,但是struct Node n的大小无法确定 n里面的大小同样无法确定//err
// 
//};
//int main()
//{
//	sizeof(struct Node);
//	return 0;
//}

//正确的写法
//struct  Node
//{
//	int data;
//	struct Node * next；//存放下一个结点
//		//设置成结构体指针类型 地址找到下一个结点的位置
//};


typedef struct Node
{
	int data;
	Node* next;//在结构体里面使用重命名之后的名字是错误的，但是可以使用重命名之前的名字
}Node;


typedef /*struct Node
{
	int data;
	struct Node* next;
}*/Node;//直接把结构体变量重命名为Node